﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace Mota
{
    public partial class App : Application
    {
        /// <summary>
        /// 可讓您輕鬆存取 Phone 應用程式的根畫面格。
        /// </summary>
        /// <returns>Phone 應用程式的根畫面格。</returns>
        public PhoneApplicationFrame RootFrame { get; private set; }

        /// <summary>
        /// Application 物件的建構函式。
        /// </summary>
        public App()
        {
            // 無法攔截之例外狀況的全域處理常式。
            // 請注意，ApplicationBarItem.Click 擲回的例外狀況不會在此加以攔截。
            UnhandledException += Application_UnhandledException;

            // 在偵錯時顯示圖形設定檔資訊。
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 顯示目前的畫面格速率計數器。
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // 在每個畫面格中顯示正在重新繪製的應用程式區域。
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // 啟用非生產分析視覺化模式，
                // 此種模式會以彩色覆蓋格式顯示正在進行 GPU 加速的頁面區域。
                //Application.Current.Host.Settings.EnableCacheVisualization = true;
            }

            // 標準 Silverlight 初始化
            InitializeComponent();

            // Phone 專屬初始化
            InitializePhoneApplication();
        }

        // 應用程式啟動 (例如從 [開始]) 時所要執行的程式碼
        // 重新啟用應用程式時不會執行這個程式碼
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
        }

        // 啟用應用程式 (提到前景) 時所要執行的程式碼
        // 第一次啟動應用程式時不會執行這個程式碼
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
        }

        // 停用應用程式 (送到背景) 時所要執行的程式碼
        // 關閉應用程式時不會執行這個程式碼
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
        }

        // 應用程式關閉 (例如使用者按下 [上一步]) 時所要執行的程式碼
        // 停用應用程式時不會執行這個程式碼
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
        }

        // 導覽失敗時所要執行的執行碼
        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 導覽失敗; 請中斷偵錯工具
                System.Diagnostics.Debugger.Break();
            }
        }

        // 發生無法處理的例外狀況時所要執行的程式碼
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 發生無法處理的例外狀況; 請中斷偵錯工具
                System.Diagnostics.Debugger.Break();
            }
        }

        #region Phone 應用程式初始化

        // 避免雙重初始化
        private bool phoneApplicationInitialized = false;

        // 不要將其他任何程式碼新增到這個方法
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // 建立畫面格，但還不要將它設定為 RootVisual; 這可讓啟動顯示
            // 畫面保持作用中狀態，直到應用程式準備開始轉譯為止。
            RootFrame = new PhoneApplicationFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // 處理導覽失敗
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // 確認不會重新初始化
            phoneApplicationInitialized = true;
        }

        // 不要將其他任何程式碼新增到這個方法
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // 將根 Visual 設定為允許應用程式轉譯
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // 由於已不再需要此處理常式而將它移除
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }

        #endregion
    }
}